package com.行为型模型.O命令模式;

/**
 * 1，优点：
 * 降低系统的耦合度。命令模式能将调用操作的对象与实现该操作的对象解耦。 增加或删除命令非常方便。采用命令模式增加与删除命令不会影响其他类，
 * 它满足“开闭原则”， 对扩展比较灵活。 可以实现宏命令。命令模式可以与组合模式结合，将多个命令装配成一个组合命令，即宏命令。
 * 方便实现 Undo 和 Redo 操作。命令模式可以与后面介绍的备忘录模式结合，实现命令的撤销 与恢复。
 * 2，缺点：
 * 使用命令模式可能会导致某些系统有过多的具体命令类。
 * 系统结构更加复杂。
 *
 * 使用场景 ：
 * 系统需要将请求调用者和请求接收者解耦，使得调用者和接收者不直接交互。
 * 系统需要在不同的时间指定请求、将请求排队和执行请求。
 * 系统需要支持命令的撤销(Undo)操作和恢复(Redo)操作。
 *  JDK源码解析 Runable是一个典型命令模式，Runnable担当命令的角色，Thread充当的是调用者，start方法就 是其执行方法
 */
public class Test {
    public static void main(String[] args) {
        //创建两个订单
        Order order1=new Order();
        order1.setDiningTable(1);
        order1.setFoodDic("鱼香肉丝",1);

        Order order2=new Order();
        order2.setDiningTable(2);
        order2.setFoodDic("庆丰包子",8);

        //创建接受者
        SeniorChef receiver=new SeniorChef();
        //将订单和接收者封装成命令对象
        OrderCommand cmd1=new OrderCommand(receiver,order1);
        OrderCommand cmd2=new OrderCommand(receiver,order2);

        //创建调用者  服务员
        Waitor waitor=new Waitor();
        waitor.setCommand(cmd1);
        waitor.setCommand(cmd2);
        //将订单带到前台 并喊厨师做饭
        waitor.orderUp();
    }

}
